/**
 * 用户状态管理
 * 轻量级状态管理，无需 Pinia
 */

import { ref, computed } from 'vue'
import type { UserInfo } from '@/api/auth'
import { TOKEN_KEY, USER_INFO_KEY, REFRESH_TOKEN_KEY } from '@/config/env'
import { logout as logoutApi } from '@/api/auth'

// 用户信息（全局单例）
const userInfo = ref<UserInfo | null>(null)
const accessToken = ref<string>('')

/**
 * 用户状态管理 Hook
 */
export const useUser = () => {
    // 是否已登录
    const isLoggedIn = computed(() => !!accessToken.value && !!userInfo.value)

    /**
     * 初始化用户信息（从本地存储读取）
     */
    const initUser = () => {
        try {
            const storedToken = uni.getStorageSync(TOKEN_KEY)
            const storedUserInfo = uni.getStorageSync(USER_INFO_KEY)

            if (storedToken) {
                accessToken.value = storedToken
            }

            if (storedUserInfo) {
                userInfo.value = JSON.parse(storedUserInfo)
            }
        } catch (error) {
            console.error('初始化用户信息失败:', error)
        }
    }

    /**
     * 设置用户信息
     */
    const setUserInfo = (user: UserInfo) => {
        userInfo.value = user
        try {
            uni.setStorageSync(USER_INFO_KEY, JSON.stringify(user))
        } catch (error) {
            console.error('保存用户信息失败:', error)
        }
    }

    /**
     * 设置 Token
     */
    const setToken = (token: string) => {
        accessToken.value = token
        try {
            uni.setStorageSync(TOKEN_KEY, token)
        } catch (error) {
            console.error('保存 Token 失败:', error)
        }
    }

    /**
     * 设置登录信息（用户信息 + Token + Refresh Token）
     */
    const setLoginInfo = (user: UserInfo, token: string, refreshToken?: string) => {
        setUserInfo(user)
        setToken(token)
        if (refreshToken) {
            try {
                uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken)
            } catch (error) {
                console.error('保存 Refresh Token 失败:', error)
            }
        }
    }

    /**
     * 清除用户信息
     */
    const clearUser = () => {
        userInfo.value = null
        accessToken.value = ''
        try {
            uni.removeStorageSync(USER_INFO_KEY)
            uni.removeStorageSync(TOKEN_KEY)
            uni.removeStorageSync(REFRESH_TOKEN_KEY)
        } catch (error) {
            console.error('清除用户信息失败:', error)
        }
    }

    /**
     * 登出
     */
    const logout = async (navigateToLogin = true) => {
        try {
            // 调用后端登出接口
            await logoutApi()
        } catch (error) {
            console.error('登出接口调用失败:', error)
        } finally {
            // 无论接口是否成功，都清除本地数据
            clearUser()

            // 跳转到登录页
            if (navigateToLogin) {
                uni.reLaunch({
                    url: '/pages/login/login'
                })
            }
        }
    }

    /**
     * 检查登录状态
     * 如果未登录，跳转到登录页
     */
    const checkLoginStatus = (): boolean => {
        if (!isLoggedIn.value) {
            uni.showToast({
                title: '请先登录',
                icon: 'none'
            })
            setTimeout(() => {
                uni.reLaunch({
                    url: '/pages/login/login'
                })
            }, 1500)
            return false
        }
        return true
    }

    return {
        // 状态
        userInfo,
        accessToken,
        isLoggedIn,

        // 方法
        initUser,
        setUserInfo,
        setToken,
        setLoginInfo,
        clearUser,
        logout,
        checkLoginStatus
    }
}

